package Persistencia;

import Negocio.Comentario;
import Negocio.Evento;
import Negocio.EventoPrivado;
import Negocio.Usuario;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


public class PEvento {

    public static void crearEventoBD(Evento e) {
        int i = 0;
        Connection con = null;
        Statement st = null;
        ResultSet r = null;
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String fechaIni = sdf.format(e.getFechaIni());
 

        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            if (e instanceof EventoPrivado) { //compruebo si el evento es eprivado 
                EventoPrivado ep = (EventoPrivado) e;
                i = st.executeUpdate("insert into evento (fecha_inicio,nombre,descripcion,foto,id_usuario,lugar,provincia,isAnuncio) values "
                        + "('" + fechaIni + "','" + ep.getNombre() + "','" + ep.getDescripcion() + "','" + ep.getRutaFoto() + "'," + ep.getUsuario().getId() + ",'" + ep.getLugar() + "','" + ep.getProvincia() + "',1)");
                
                //inserto el evento y me quedo con el ultimo id insertado en la bbdd
                r = st.executeQuery("SELECT ID FROM evento ORDER BY ID DESC");
                if (r.next()) {
                    ep.setId(r.getInt("id"));
                }
            } 
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                st.close();
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(PEvento.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

    public static EventoPrivado seleccionarEventoBD(EventoPrivado evento) {
        int i = 0;
        Connection con = null;
        Statement st = null;
        Usuario usuario = null;
        EventoPrivado ep = new EventoPrivado();

        try {

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

                ResultSet r = st.executeQuery("select id,fecha_inicio,nombre,descripcion,foto,id_usuario,lugar,provincia from evento where evento.id=" + evento.getId() + " and evento.isAnuncio=1");
                while (r.next()) {
                    
                    ep.setId(r.getInt("id"));
                    ep.setFechaIni(r.getDate("fecha_inicio"));
                    ep.setNombre(r.getString("nombre"));
                    ep.setDescripcion(r.getString("descripcion"));
                    ep.setRutaFoto(r.getString("foto"));
                    ep.setUsuario(Usuario.selecionarUsuarioLite(r.getInt("id_usuario")));
                    ep.setLugar(r.getString("lugar"));
                    ep.setProvincia(r.getString("provincia"));
                    //ep.setAmigos(mostrarUsuariosEventoBD(ep));//lista de amigos invitados al evento

                }

             

            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }

        return ep;
    }

    public static Evento seleccionarEventoLiteBD(int codEvento) {
        int i = 0;
        Connection con = null;
        Statement st = null;
        Evento evento = null;
        try {

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

            ResultSet r = st.executeQuery("select id,fecha_inicio,nombre,foto,lugar,provincia from evento where evento.id=" + codEvento + " and evento.isAnuncio=1");
            while (r.next()) {//realizo la consulta si es un evento privado entra aqui y realiza los seter en eprivado
                EventoPrivado e = new EventoPrivado();
                e = new EventoPrivado();
                e.setId(r.getInt("id"));
                e.setFechaIni(r.getDate("fecha_inicio"));
                e.setNombre(r.getString("nombre"));
                e.setRutaFoto(r.getString("foto"));
                e.setLugar(r.getString("lugar"));
                e.setProvincia(r.getString("provincia"));
                evento = e;
            }

           

            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }

        return evento;
    }

    public static List<Usuario> mostrarUsuariosEventoBD(Evento e) {// para ver los usuarios que van a un evento privado
        List<Usuario> amigosEvento = new ArrayList<Usuario>();
        Usuario usuario;
        try {
            Connection con = null;
            Statement st = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            ResultSet r = st.executeQuery("select id,respuesta,id_usuario,id_evento from usuarioevento where usuarioevento.id_evento=" + e.getId());
            while (r.next()) {// realizo la consulta para ver los usuarios que van a un evento en concreto y lo meto en una lista, y devuelvo esa lista
                usuario = Usuario.selecionarUsuarioLite(r.getInt("id_usuario"));
                amigosEvento.add(usuario);
            }
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        return amigosEvento;
    }

    public static List<EventoPrivado> mostrarEventosBD(Usuario usuario, int tipo) { // para mostrar los eventos de un usuario en concreto
        List<EventoPrivado> listaEventos = new ArrayList<EventoPrivado>();
        EventoPrivado evento = null;

        try {
            Connection con = null;
            Statement st = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            ResultSet r = st.executeQuery("select id,fecha_inicio,nombre,foto,lugar,precio from evento where evento.id_usuario=" + usuario.getId() + " and isAnuncio=" + tipo);
            // realizo la consulta para devolver los eventos de un usuario en concreto y con el tipo miro si es un Ep o anuncio, para devolver solo los de un tipo
            while (r.next()) {
                int idEvento = r.getInt("id");
                EventoPrivado e = (EventoPrivado) Evento.seleccionarEventoLite(idEvento);
                listaEventos.add(e);
            }
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        return listaEventos; // devuelvo la lista de eventos de un usuario
    }
    
    public static List<EventoPrivado> mostrarEventosPorProvinciaBD(String provincia) { // para mostrar los eventos de una provincia
        List<EventoPrivado> listaEventos = new ArrayList<EventoPrivado>();

        try {
            Connection con = null;
            Statement st = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            ResultSet r = st.executeQuery("select id,fecha_inicio,nombre,foto,id_usuario,lugar,precio from evento where isAnuncio=1 and provincia=" + provincia);
            // realizo la consulta para devolver los eventos de la provincia selecccionada
            while (r.next()) {
                int idEvento = r.getInt("id");
                EventoPrivado e = (EventoPrivado) Evento.seleccionarEventoLite(idEvento);
                e.setUsuario(Usuario.selecionarUsuarioLite(r.getInt("id_usuario")));
                listaEventos.add(e);
            }
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        return listaEventos; // devuelvo la lista de eventos de una provincia
    }
    
    public static List<EventoPrivado> mostrarEventosBD() { // para mostrar todos los eventos
        List<EventoPrivado> listaEventos = new ArrayList<EventoPrivado>();

        try {
            Connection con = null;
            Statement st = null;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();
            ResultSet r = st.executeQuery("select id,fecha_inicio,nombre,foto,id_usuario,lugar,precio from evento where isAnuncio=1");
            // realizo la consulta para devolver los eventos de la provincia selecccionada
            while (r.next()) {
                int idEvento = r.getInt("id");
                EventoPrivado e = (EventoPrivado) Evento.seleccionarEventoLite(idEvento);
                e.setUsuario(Usuario.selecionarUsuarioLite(r.getInt("id_usuario")));
                listaEventos.add(e);
            }
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        return listaEventos; // devuelvo la lista de eventos
    }

    public static void modificarEventoBD(Evento evento) {//recibe un evento modificado y lo insertamos en la bbdd
        int i = 0;
        Connection con = null;
        Statement st = null;
        Usuario usuario = null;
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String fechaIni = sdf.format(evento.getFechaIni());
        //String fechaFin = sdf.format(evento.getFechaFin());

        try {

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

            if (evento instanceof EventoPrivado) {// si es Ep
                EventoPrivado e = (EventoPrivado) evento;
                st.executeUpdate("update evento set fecha_inicio='" + fechaIni + "',nombre='" + e.getNombre() + "',descripcion='" + e.getDescripcion() + "',foto='" + e.getRutaFoto() + "',id_usuario=" + e.getUsuario().getId() + ",lugar='" + e.getLugar() +"', provincia='" + e.getProvincia() + "' where evento.id=" + e.getId());

            } 
            st.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }

    public static void eliminarEventoBD(EventoPrivado e) {// recibe el evento que vamos a modificar
        Connection con = null;
        Statement st = null;

        try {

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            st = con.createStatement();

            st.executeUpdate("DELETE FROM evento WHERE ID = " + e.getId());

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                st.close();
                con.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }
}
 